import axios from 'axios';
import { api } from './api.js';
import router from '@/router/index';
import {
  ElNotification
} from 'element-plus'
// 是否正在刷新的标记
let isRefreshing = false;
// 重试队列，每一项将是一个待执行的函数形式
let requests = [];

export const axiosConfig = () => {
  axios.defaults.baseURL = import.meta.env.VITE_API_URL;
  // axios.defaults.timeout = 2500;
  // 添加请求拦截器
  handleAxiosRequestInterceptors(axios);
  /* 添加响应拦截器 */
  handleAxiosResponseInterceptors(axios);
}

/* axios处理请求拦截器 */
function handleAxiosRequestInterceptors (axios) {
  axios.interceptors.request.use(function (config) {
    // 每个请求头中添加 token
    const Token = localStorage.getItem('Authorization');
    if (Token) {
      config.headers.Authorization = Token; //将token放到请求头发送给服务器
      return config;
    }
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });
}
/* axios处理响应拦截器 */
function handleAxiosResponseInterceptors (axios) {
  axios.interceptors.response.use(async (response) => {
    /* 刷新token的参数 */
    let refreshParam = {
      refreshToken: ''
    }
    // 对返回的数据进行一些处理
    // 根据后端返回的code 进行判断即可
    if (response.data.status === 2) {
      /* accessToken失效 */
      refreshParam.refreshToken = localStorage.getItem('refreshToken');
      /* 利用refreshToken刷新accessToken */
      if (!isRefreshing) {
        isRefreshing = true;
        let refreshToken = '';
        try {
          refreshToken = await api.postRefreshToken(refreshParam, "POST");
          /* 重新赋值accessToken与 refreshToken*/
          localStorage.setItem("Authorization", refreshToken.result.accessToken);
          localStorage.setItem("refreshToken", refreshToken.result.refreshToken);
          requests.forEach(request => request());
          requests = [];
          isRefreshing = false;
          /* 重新发送上一条请求（这条请求不会再下的else代码中拦截）await不需要加 */
          return axios.request(response.config);
        } catch (error) {
          isRefreshing = false;
          // handelAxiosResponseError(error);
          return error;
        }
      }
      // 正在刷新token，将返回一个未执行resolve的promise
      // 拦截其他所有的请求，使其处于一个未执行的状态，只有当刷新token请求返回以后，再执行拦截的所有请求
      return handleInterceptedRequest(response);
    }
    return response;
  }, (error) => {
    isRefreshing = false;
    console.log(error.response);
    handelAxiosResponseError(error.response);
    return error.response;
  });
}

/**
 * 重新登录提示框，并跳转到登录页面
 */
function handleMessageLogin () {
  if (!localStorage.getItem('Authorization')) return;
  localStorage.removeItem("Authorization");
  console.log(router);
  const redirect = router.currentRoute.fullPath;
  ElNotification.warning({ title: '提示', message: '登录过期，请重新登录' });
  /* 跳转到登录页，而后登录成功，还返回当前页 */

  router.replace({
    path: '/login',
    query: {
      redirect
    }
  })
  isRefreshing = false;
}

/* 处理 axios 返回拦截器的 异常信息*/
function handelAxiosResponseError (error) {
  if (!isRefreshing) {
    let title = '错误';
    let message = '';
    if (error.status === 401) {
      handleMessageLogin();
      return;
    } else if (error.status === 403) {
      message = '当前操作没有权限';
    } else if (error.status === 404) {
      message = '服务器找不到给定的资源';
    } else if (error.status === 500) {
      message = '系统异常,请联系管理员';
    } else if (error.status === 503) {
      message = '服务器繁忙，请稍后再试';
    }
    isRefreshing = false;
    ElNotification.error({ title, message });
  }
}

/* 收集被拦截的请求 */
function handleInterceptedRequest (response) {
  return new Promise((resolve) => {
    // 将resolve放进队列，用一个函数形式来保存，等token刷新后直接执行
    requests.push(() => {
      resolve(axios.request(response.config))
    })
  })
}